// 1.引入加密所需依赖
import { Crypto } from './crypto-min.js' // 阿里云oss签名所需的加密js文件
// npm install js-base64

import axios from "axios"; // 基于 promise 的 HTTP 库

const Base64 = require('js-base64').Base64;
const config = { headers: { 'Accept': 'application/json, text/javascript, */*; q=0.01' } }; // 处理请求跨域
const policyText = {
  "expiration": "2099-01-01T12:00:00.000Z", //设置该Policy的失效时间，超过这个失效时间之后，就没有办法通过这个policy上传文件了
  "conditions": [["content-length-range", 0, 1048576000] // 设置上传文件的大小限制
  ]
};
/** 文件上传方法
  * @param data // 阿里云oss的配置文件
  * @param file // 文件
  **/
export function upload(data, file) {
  //******注意这三行是阿里云的签名加密******
  let policyBase64 = Base64.encode(JSON.stringify(policyText));
  let bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, data.AccessKeySecret, { asBytes: true });
  let signature = Crypto.util.bytesToBase64(bytes);

  //******请求阿里oss接口必传参数,注意必须是FormData格式******
  let multipart_params = formData({
    'key': `data.directory/${getFileName(file.name)}`, // 文件存储路径
    'policy': policyBase64, // Policy表单域用于验证请求的合法性
    'success_action_status': 200, // 文件上传成功服务器返回的状态
    'OSSAccessKeyId': data.AccessKeyId,
    'signature': signature,
    'file': file.raw
  });
  // process.env.VUE_APP_OSS_URL改为自己的上传地址
  return axios.post(process.env.VUE_APP_OSS_URL, multipart_params, config).then(() => {
    return process.env.VUE_APP_OSS_URL + '/' + multipart_params.get('key') // 返回文件的绝对地址
  })
}

/** 对象转换为formData类型 */
function formData(obj) {
  if (obj instanceof Object) {
    let multipart_params = new FormData();
    for (let key in obj) {
      multipart_params.append(key, obj[key]);
    }
    return multipart_params;
  }
  return;
}

/** 生成随机文件名 格式为随机6位数+时间戳+文件类型 */
function getFileName(filename) {
  let pos = filename.lastIndexOf('.')
  if (pos != -1) {
    return randomString(6) + new Date().getTime() + filename.substring(pos - 1);
  }
  return '';
}

/** 随机数 未指定长度则为32位 */
function randomString(len) {
  len = len || 32;
  let chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
  let maxPos = chars.length;
  let pwd = '';
  for (let i = 0; i < len; i++) {
    pwd += chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
}